<?php

namespace IYUU\sdk\CoolQ;

use Request as IRequest;

/**
 * Request 请求参数生成类
 * Class Request
 * @package IYUU\sdk\CoolQ
 */
class Request extends IRequest
{
    /**
     * @var string 服务类名
     */
    protected $className;

    /**
     * @var string 服务方法名
     */
    protected $actionName;

    /**
     * - 如果需要定制已知的数据源（即已有数据成员），则可重载此方法，例
     *
     * ```
     * class MyRequest extend Request{
     *     public function __construct($data = NULL) {
     *         parent::__construct($data);
     *
     *         // json处理
     *         $this->post = json_decode(file_get_contents('php://input'), TRUE);
     *
     *         // 普通xml处理
     *         $this->post = simplexml_load_string (
     *             file_get_contents('php://input'),
     *             'SimpleXMLElement',
     *             LIBXML_NOCDATA
     *         );
     *         $this->post = json_decode(json_encode($this->post), TRUE);
     *     }
     * }
     * ```
     * - 其他格式或其他xml可以自行写函数处理
     *
     * @param array|mixed|null $data 参数来源，可以为：$_GET/$_POST/$_REQUEST/自定义
     */
    public function __construct($data = null)
    {
        parent::__construct($data);

        @list($this->className, $this->actionName) = explode('.', $this->getService());
    }

    /**
     * 获取接口服务名称
     *
     * - 子类可重载此方法指定参数名称，以及默认接口服务
     * - 需要转换为原始的接口服务格式，即：Namespace.Class.Action
     * - 为保持兼容性，子类需兼容父类的实现
     * - 参数名为：post_type
     *
     * @return string 接口服务名称，如：Message.index
     */
    public function getService(): string
    {
        $post_type = $this->get('post_type');

        // 尝试根据接口参数进行解析
        if ($post_type === null) {
            $service = 'Message.index';
        } else {
            $service = $post_type . '.index';
        }

        return $service;
    }

    /**
     * 获取服务名称中的类名
     * @return string 类名
     */
    public function getServiceClass(): string
    {
        return $this->className;
    }

    /**
     * 获取服务名称中的方法名
     * @return string 方法名
     */
    public function getServiceAction(): string
    {
        return $this->actionName;
    }
}
